// Copyright (C) 2023 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
// 
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<北京小羊驼科技有限公司>，授权编号：<NT231212144350>，代码指纹：<A.702363430.550>，技术对接人微信：<ID: wxid_wbyootvkdcgj22>】
// 【授权寄送：<收件：苏先生、地址：北京市大兴区北京密码西区6号楼1单元301、电话：18613885610、邮箱：bd@huiyuanxiang-inc.com>】
// 
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
// 
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
//package com.x52im.rbchat.logic.chat_root;
//
//import android.app.Activity;
//import android.content.Intent;
//import android.os.Bundle;
//import android.util.Log;
//import android.view.View;
//import android.view.ViewGroup;
//import android.widget.Button;
//import android.widget.CheckBox;
//import android.widget.ImageView;
//import android.widget.TextView;
//
//import com.bumptech.glide.Glide;
//import com.eva.android.ArrayListObservable;
//import com.eva.android.widget.ARecyclerViewAdapter;
//import com.eva.android.widget.DataLoadableActivity;
//import com.eva.android.widget.WidgetUtils;
//import com.eva.epc.common.util.CommonUtils;
//import com.eva.framework.dto.DataFromServer;
//import com.google.gson.Gson;
//import com.x52im.rainbowchat.http.logic.dto.RosterElementEntity;
//import com.x52im.rbchat.Const;
//import com.x52im.rbchat.MyApplication;
//import com.x52im.rbchat.R;
//import com.x52im.rbchat.cache.ImageCacheLoader;
//import com.x52im.rbchat.logic.chat_root.model.CardMeta;
//import com.x52im.rbchat.logic.sns_group.GroupMemberActivity;
//import com.x52im.rbchat.network.http.async.QueryFriendInfo;
//import com.x52im.rbchat.utils.IntentFactory;
//
//import java.util.ArrayList;
//import java.util.List;
//
//import androidx.core.content.ContextCompat;
//import androidx.recyclerview.widget.DividerItemDecoration;
//import androidx.recyclerview.widget.LinearLayoutManager;
//import androidx.recyclerview.widget.RecyclerView;
//
///**
// * 用户选择界面。
// *
// * <p>
// * * 目前用于：个人名片消息发送时选择要发送的用户时使用；
// * * 未来可扩展用于：消息转发等等需要进行用户选择的功能下。
// * </p>
// *
// * <p>
// * 本界面代码简化自 {@link GroupMemberActivity} ，原本是想
// * 在其实进行高度提炼并进行重用，但考虑到可维护性（因为更多不同用途的场景进行重用，会严重加重它的代码量和复杂性），
// * 因而放弃重用，转而重新维护一个更简洁的版本（也就是本界面），代码好维护总比盲目追求重用要好的多。
// *
// * 日后在进行界面美化时，可以本界面可以与{@link GroupMemberActivity}
// * 同步进行优化，因为UI和功能逻辑是相通的。
// * </p>
// *
// * @author JackJiang
// * @since 5.1
// * @see GroupMemberActivity
// */
//// TODO: 将重构为TargetChooseActivity!!!!!!!!!!!!!!!
//public class UserChooseActivity2 extends DataLoadableActivity
//{
//    private final static String TAG = UserChooseActivity2.class.getSimpleName();
//
//    /** 本界面用途之：聊天界面中发送"个人名片"消息时选择被发送的用户 */
//    public final static int USED_FOR_SEND_CONTACT_MESSAGE = 0;
//
//    /** 【内容UI主组件1】：可供选择的用户列表 */
//    private RecyclerView groupListView;
//    /** 用户列表Adapter */
//    private RecyclerViewLinearAdapter groupListAdapter;
//
//    /** 【内容UI主组件2】：父布局 - 添加好友的父组件引用 */
//    private ViewGroup addGroupLL = null;
//    /** 按钮：确认 */
//    private Button btnOK = null;
//
//    /** 用户列表的数据结构对象. */
//    private ArrayList<UserEntity> staticListData = new ArrayList<>();
//
//    /**
//     * Intent传进来的参数：本界面的业务用途（比如：用于什么功能）。
//     * @see #USED_FOR_SEND_CONTACT_MESSAGE */
//    private int usedForForInit = -1;
//    /**
//     * Intent传进来的参数：聊天类型（比如：用于一对一聊还是群聊中）。
//     * @see Const#CHAT_TYPE_FREIDN$CHAT */
//    private String chatTypeForInit = null;
//    /**
//     * Intent传进来的参数：本界面选中的数据要发送给的目标id
//     * 注意：目前本字段仅用于 #usedForForInit==USED_FOR_SEND_CONTACT_MESSAGE && chatType=好友或陌生人聊天时
//     *      ，其它情况下本参数无意义，可以填null！*/
//    private String toIdForInit = null;
//
//    // 是否显示选择框
//    private boolean showCheckBox = true;
//    // 是否支持单选
//    private boolean singleSelection = false;
//
//    /**
//     * {@inheritDoc}
//     */
//    @Override
//    protected void initDataFromIntent()
//    {
//        //解析从intent中传过来的数据
//        ArrayList intentDatas = IntentFactory.parseUserChooseActivityIntent(getIntent());
//        this.usedForForInit = (Integer) intentDatas.get(0);
//        this.chatTypeForInit = (String) intentDatas.get(1);
//        this.toIdForInit = (String) intentDatas.get(2);
//    }
//
//    // 界面恢复到前台时
//    protected void onResume()
//    {
//        super.onResume();
//
//        // 强制要求每次进来都更新列表（从而保证当数据更新后能及时刷新最新的显示）
//        groupListAdapter.notifyDataSetChanged();
//    }
//
//    @Override
//    protected void initViews(Bundle savedInstanceState)
//    {
//        //设定自定义标题栏（设定此值即意味着开启自定义标题栏的使用，必须要在setContentView前设定）
//        customeTitleBarResId = R.id.user_choose_list_view_titleBar;
//        //养成良好习惯：首先设置主layout，确保后绪的操作中使用到的组件都可以被find到
//        setContentView(R.layout.user_choose_list);
//
//        // 各UI组件
//        addGroupLL = findViewById(R.id.user_choose_list_view_addGroupLL);
//        // 标题栏按钮实例
//        btnOK = this.getCustomeTitleBar().getRightGeneralButton();
//        // 设置标题栏按钮的ui样式
//        GroupMemberActivity.setTextButtonStyleForTitle(this, btnOK);
//        // 设置ok按钮的初始状态
//        _setOkButtonEnable(false);
//
//        // 列表及列表的adapter
//        groupListView = findViewById(R.id.user_choose_list_listView);
//        // 对列表对象进行相关初始化
//        this._initRecyclerView();
//
//        if(usedForForInit == USED_FOR_SEND_CONTACT_MESSAGE)
//        {
//            this.setTitle("选择好友");
//            this.btnOK.setVisibility(View.VISIBLE);
//            this.showCheckBox = true;
//            this.singleSelection = true;
//        }
//    }
//
//    private void _initRecyclerView()
//    {
//        // 使RecyclerView保持固定的大小,这样会提高RecyclerView的性能
//        groupListView.setHasFixedSize(true);
//
//        //设置分割线（使用官方的一个默认实现，不然自已来画就太烦了）
//        DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL);
//        dividerItemDecoration.setDrawable(
//                ContextCompat.getDrawable(this, R.drawable.user_choose_recycleview_divider));
//        groupListView.addItemDecoration(dividerItemDecoration);
//
//        // 设置线性布局管理器
//        groupListView.setLayoutManager(new LinearLayoutManager(this));
//        // 实例化Adapter
//        groupListAdapter = new RecyclerViewLinearAdapter(this, null);
//        // 设置Adapter
//        groupListView.setAdapter(groupListAdapter);
//        // 强制刷新显示（目的是触发内容改变并通知观察者）
//        groupListAdapter.notifyDataSetChanged();
//    }
//
//    /**
//     * 本方法由父类的onCreate()调用，子类可在此方法中为各UI功能组件增加事件临听。
//     */
//    @Override
//    protected void initListeners()
//    {
//        // 确认按钮事件处理
//        btnOK.setOnClickListener(v -> {
//            // 选择要发送的个人名片
//            if(usedForForInit == USED_FOR_SEND_CONTACT_MESSAGE)
//            {
//                UserEntity ue = getSingleSelectedUser();
//                if(ue != null) {
//
//                    Log.i(TAG, "【好友选择】选择完成，uid=" + ue.getUser_uid()+", uname="+ue.getNickname());
//
//                    CardMeta cm = new CardMeta(ue.getUser_uid(), ue.getNickname());
//
//                    // 再调置回调数据
//                    Intent intent = new Intent();
//                    intent.putExtra("selected_user", cm);
//                    setResult(RESULT_OK, intent);
//
//                    finish();
//                } else {
//                    WidgetUtils.showWithDialog(self(), $$(R.string.general_prompt), "选择结果是空的！");
//                }
//
//            }
//        });
//    }
//
//    /**
//     * 获得单选模式下被选中的用户.
//     *
//     * @return
//     */
//    private UserEntity getSingleSelectedUser()
//    {
//        UserEntity retGme = null;
//
//        for(UserEntity gme : this.groupListAdapter.getListData())
//        {
//            if(gme.isSelected())
//            {
//                retGme = gme;
//                break;
//            }
//        }
//
//        return retGme;
//    }
//
//    /**
//     * 获得当前选中的行。
//     *
//     * @return
//     */
//    private ArrayList<UserEntity> getSelectedItems()
//    {
//        ArrayList<UserEntity> items = new ArrayList<>();
//        for(UserEntity gme : this.groupListAdapter.getListData())
//        {
//            if(gme.isSelected())
//            {
//                items.add(gme);
//            }
//        }
//
//        return items;
//    }
//
//    /**
//     * 返回选中的行数。
//     *
//     * @return
//     */
//    public int getSelectedCount()
//    {
//        int cnt = 0;
//        for(UserEntity gme : this.groupListAdapter.getListData()) {
//            if(gme.isSelected()) {
//                cnt += 1;
//            }
//        }
//        return cnt;
//    }
//
//    /**
//     * 重置确认为初始状态：不可点击、文字内容显示为"确定"、以及按钮的UI样式为半透明效果。
//     */
//    private void _resetOkButton()
//    {
////        this.btnOK.setBackgroundResource(R.drawable.common_btn_red_2018_transparent);
////        this.btnOK.setTextColor(getResources().getColor(R.color.white_50transparent));
////        this.btnOK.setEnabled(false);
//
//        // 设置标题栏保存按钮的可用与禁用时样式
//        GroupMemberActivity.setTextButtonEnableForTitle(this, this.btnOK, false);
//        this.btnOK.setText("确定");
//    }
//
//    /**
//     * 决置确认按钮的可用性。
//     *
//     * @param enabled
//     */
//    private void _setOkButtonEnable(boolean enabled)
//    {
//        if(enabled) {
////            this.btnOK.setBackgroundResource(R.drawable.common_btn_red_2018);
////            this.btnOK.setTextColor(getResources().getColor(R.color.white));
////            this.btnOK.setEnabled(true);
//
//            // 设置标题栏保存按钮的可用与禁用时样式
//            GroupMemberActivity.setTextButtonEnableForTitle(this, this.btnOK, true);
//        }
//        else {
//            _resetOkButton();
//        }
//    }
//
//    /**
//     * 设置确认按钮上的选中数量，并根据选中数据量决定按钮是否可点击。
//     *
//     * @param selectedCount
//     */
//    private void setOkButtonForSelected(int selectedCount)
//    {
//        if(selectedCount > 0) {
//            _setOkButtonEnable(true);
//            if(usedForForInit == USED_FOR_SEND_CONTACT_MESSAGE)
//                this.btnOK.setText("确定");
//            else
//                this.btnOK.setText("确定("+selectedCount+")");
//        }
//        else {
//            _setOkButtonEnable(false);
//        }
//    }
//
//    /**
//     * 本方法默认被父类的loadData调用，用于异步刷新界面数据.
//     *
//     * @param params loadData中传进来的参数，本类中该参数没有被用到
//     */
//    @Override
//    protected DataFromServer queryData(String... params)
//    {
//        DataFromServer dfs = new DataFromServer();
//
//        // 用于发送个人名片消息时的用户列表数据（直接取我的本地好友列表即可）
//        if(usedForForInit == USED_FOR_SEND_CONTACT_MESSAGE)
//        {
//            dfs.setSuccess(true);
//
//            ArrayList<UserEntity> memberList = new ArrayList<>();
//
//            // 我的好友列表数据
//            ArrayListObservable<RosterElementEntity> myRoster = MyApplication.getInstance(this)
//                    .getIMClientManager().getFriendsListProvider().getRosterData(this, false);
//            if (myRoster != null && myRoster.getDataList().size() > 0)
//            {
//                for (RosterElementEntity ree : myRoster.getDataList())
//                {
//                    // 当是一对一聊天（好友或陌生人时），要对可选的名片列表去除接收者自已（向他发送他自已的名片就没意义了，微信也是这种逻辑）
//                    if((chatTypeForInit.equals(Const.CHAT_TYPE_FREIDN$CHAT) || chatTypeForInit.equals(Const.CHAT_TYPE_GUEST$CHAT) )
//                            && toIdForInit != null
//                            && toIdForInit.equals(ree.getUser_uid()))
//                    {
//                        continue;
//                    }
//
//                    UserEntity m = constructFromRosterElement(ree);
//                    if(m != null)
//                        memberList.add(m);
//                }
//            }
//
//            // 将组织好的数据放入DataFromServer对象，refreshToView(..)方法中将能直接拿到
//            dfs.setReturnValue(memberList);
//        }
//
//        return dfs;
//    }
//
//    /**
//     * 本方法的作用是把queryData里返回的数据放到UI上显示.
//     */
//    @Override
//    protected void refreshToView(Object dataToView)
//    {
//        // 显示用户列表数据
//        if (usedForForInit == USED_FOR_SEND_CONTACT_MESSAGE)
//        {
//            staticListData = (dataToView == null? new ArrayList<UserEntity>(): (ArrayList<UserEntity>) dataToView);
//        }
//
//        // 设置列表数据
//        groupListAdapter.setListData(staticListData);
//        // 强制刷新列表的UI显示（目的是触发内容改变并通知观察者）
//        groupListAdapter.notifyDataSetChanged();
//    }
//
//    private UserEntity constructFromRosterElement(RosterElementEntity ree)
//    {
//        if(ree != null)
//        {
//            // 通过对原RosterElementEntity对象进行JSON序列化与反序列化，从而实现对象数据的克隆
//            String jsonStr = new Gson().toJson(ree);
//            UserEntity m = new Gson().fromJson(jsonStr, UserEntity.class);
//            m.setSelected(false);
//
//            // FIXME: 这里通过json序列化和反序列化太耗性能，应该改成UserEntity对象，加上user字段更合适！
//            //  明天改前，先看一下这一块的耗时有多少，如果确信耗时太大，那就非改不可！改好这个，rbpv8.3版本就算是全ok了！！加油！！！
//
//
//            return m;
//        }
//        return null;
//    }
//
//
//    //-------------------------------------------------------------------------------- 内部类
//
//    /**
//     * 数据列表RecyclerView的Adapter实现类。
//     */
//    private class RecyclerViewLinearAdapter extends ARecyclerViewAdapter<UserEntity>
//    {
////        /**
////         * 图片缓存实现类，提高列表的图片管理性能
////         */
////        private AsyncBitmapLoader asyncLoader;
//
//        private ContentOnClickListener contentOnClickListener = new ContentOnClickListener();
//        private HeadIconOnClickListener headIconOnClickListener = new HeadIconOnClickListener();
//
//        public RecyclerViewLinearAdapter(Activity context, OnItemClickListener onItemClickListener)
//        {
//            super(context, R.layout.user_choose_list_item, onItemClickListener);
////            this.asyncLoader = new AsyncBitmapLoader(AvatarHelper.getUserAvatarSavedDir(context)+"/");
//        }
//
//        /**
//         * 列表adapter数据结构创建方法.
//         * 子类可覆盖此方法用以实现自已的数据结构.
//         *
//         * @return
//         */
//        @Override
//        protected List<UserEntity> createListData()
//        {
//            return staticListData;
//        }
//
//        /**
//         * {@inheritDoc}
//         */
//        @Override
//        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
//        {
//            return new LinearViewHolder(layoutInflater.inflate(itemResId, parent,false));
//        }
//
//        /**
//         * {@inheritDoc}
//         */
//        @Override
//        public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int position)
//        {
//            // 别忘了调用父类方法
//            super.onBindViewHolder(viewHolder, position);
//
//            //----------------------------------------------------------------------------- （1）组件填值
//            // 正在操作的viewHolder对象
//            LinearViewHolder holder = (LinearViewHolder)viewHolder;
//            // 正在操作的列表行的数据集
//            final UserEntity rowData = listData.get(position);
//
//            // 是否显示选择框
//            if(showCheckBox)
//                holder.cbSelect.setVisibility(View.VISIBLE);
//            else
//                holder.cbSelect.setVisibility(View.GONE);
//
//            // 给标签设置值，以供用户查看
//            holder.viewName.setText(rowData.getNickname());
//            holder.viewId.setText("ID："+rowData.getUser_uid());
//            holder.cbSelect.setChecked(rowData.isSelected());
//
//
//            //----------------------------------------------------------------------------- （2）异步加载头像
//            // 以下代码，解决Glide在RecycleView中图片错位或重复显示问题
//            Glide.with(context).clear(holder.viewAvatar);// 解决方法2
//            // clear完成后设置默认占位图，确保图片显示不出现Glide导致的错位问题
//            holder.viewAvatar.setImageResource(R.drawable.default_avatar_yuan_50_3x);
//
//            // userAvatarFileName中存放的中该人员的头像存放于服务端的文件名（也将原样用于本地的缓存文件名）为null即表示该人员没有头像
//            if(!CommonUtils.isStringEmpty((String)rowData.getUserAvatarFileName(), true))
//            {
//                // 加载头像图片
//                ImageCacheLoader.loadAvatarImgWithGlide(context, rowData.getUser_uid(), rowData.getUserAvatarFileName()
//                        , holder.viewAvatar
//                        , 25 // 圆角单位是dp
//                        , R.drawable.default_avatar_yuan_50_3x, false, false);
//            }
//
//
//            //----------------------------------------------------------------------------- （3）增加点击事件处理
//            holder.layoutOfGotochat.setOnClickListener(v -> {
//                contentOnClickListener.setContentData(rowData);
//                contentOnClickListener.onClick(v);
//            });
//            holder.viewAvatar.setOnClickListener(v -> {
//                headIconOnClickListener.setContentData(rowData);
//                headIconOnClickListener.onClick(v);
//            });
//        }
//
//        /**
//         * 根据RecyclerView内容的变动，来决定无数据时的UI内容显示。
//         */
//        protected void dataSetChanged()
//        {
//            if(this.getItemCount() > 0) {
//                addGroupLL.setVisibility(View.GONE);
//                groupListView.setVisibility(View.VISIBLE);
//            }
//            // 没有数据时显示显示ui
//            else {
//                addGroupLL.setVisibility(View.VISIBLE);
//                groupListView.setVisibility(View.GONE);
//            }
//
//            // 设置确认按钮的显示
//            setOkButtonForSelected(getSelectedCount());
//        }
//
//        private void deSelectedAll()
//        {
//            for(UserEntity gme : this.getListData())
//            {
//                gme.setSelected(false);
//            }
//        }
//
//        /**
//         * ViewHolder实现类。
//         */
//        class LinearViewHolder extends RecyclerView.ViewHolder
//        {
//            //声明layout_linearrv_item布局控件的变量
//
//            private ViewGroup layoutOfGotochat = null;
//            private TextView viewName = null;
//            private TextView viewId = null;
//            private CheckBox cbSelect = null;
//            private ImageView viewAvatar = null;
//
//            public LinearViewHolder(View itemView)
//            {
//                super(itemView);
//
//                // item里的操作组件实例
//                layoutOfGotochat = (ViewGroup) itemView.findViewById(R.id.user_choose_list_item_contentLL);
//                viewName = (TextView) itemView.findViewById(R.id.user_choose_list_item_nameView);
//                viewId = (TextView) itemView.findViewById(R.id.user_choose_list_item_idView);
//                cbSelect = (CheckBox) itemView.findViewById(R.id.user_choose_list_item_selectCb);
//                viewAvatar = (ImageView) itemView.findViewById(R.id.user_choose_list_item_imageView);
//            }
//        }
//
//        /**
//         * 点击item事件处理.
//         */
//        private class ContentOnClickListener implements View.OnClickListener
//        {
//            private UserEntity contentData = null;
//
//            public void setContentData(UserEntity contentData)
//            {
//                this.contentData = contentData;
//            }
//
//            @Override
//            public void onClick(View v)
//            {
//                if (contentData != null)
//                {
//                    // 支持多选
//                    if (!singleSelection) {
//                        contentData.setSelected(!contentData.isSelected());
//                    }
//                    // 支持单选
//                    else {
//                        // 先取消其它的选中
//                        deSelectedAll();
//                        // 再选中当前
//                        contentData.setSelected(true);
//                    }
//
//                    // 并通知刷新列表ui
//                    notifyDataSetChanged();
//                }
//            }
//        }
//
//        /**
//         * 用户头像点击事件监听器.
//         */
//        private class HeadIconOnClickListener implements View.OnClickListener
//        {
//            private UserEntity contentData = null;
//
//            public void setContentData(UserEntity contentData)
//            {
//                this.contentData = contentData;
//            }
//
//            @Override
//            public void onClick(View v)
//            {
//                if(contentData != null && contentData.getUser_uid() != null)
////                  new QueryFriendInfo((Activity)context).execute(false, null, contentData.getUser_uid());
//                    QueryFriendInfo.gotoWatchUserInfo(self(), contentData.getUser_uid(), null);
//            }
//        }
//    }
//
//    /**
//     * 一个 RosterElementEntity的子类，目的是增加是否选中标识，方便用于ListView列表中作为item数据对象。
//     */
//    public class UserEntity extends RosterElementEntity
//    {
//        private transient boolean selected = false;
//
//        public UserEntity()
//        {
//            super();
//        }
//
//        public boolean isSelected() {
//            return this.selected;
//        }
//
//        public void setSelected(boolean selected) {
//            this.selected = selected;
//        }
//    }
//}
